#pragma once

#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/epoll.h>
#include <errno.h>
#include <error.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/socket.h>
#include <unistd.h>
#include <termios.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/sendfile.h>

#define ARGS_LENGTH 2048

typedef enum
{
    LOGIN = 1,
    REGISTER,
    ERROR,
    CD,
    LS,
    MKDIR,
    RM,
    PWD,
    UP,
} cmd_t;


typedef struct 
{
    cmd_t cmd;
    char args[ARGS_LENGTH];
    char token[ARGS_LENGTH];
} messenger_t;

typedef struct 
{
    char name[20];
    char path[50];
    bool login;
    char token[ARGS_LENGTH];
} me_t;

// tcp 连接
int tcp(int* sock_fd);

// 获得配置信息
int getparameter(const char *key, char *value);


// 登录
int login(me_t* me, int sock_fd);

// 注册
int register_(me_t* me, int sock_fd);

// pwd
int pwd(const me_t* me);

// 分析命令
cmd_t analyse(char* cmd);

// ls
int ls(me_t* me, int sock_fd, char* cmd);

// up
int up(messenger_t* msg, int sock_fd);

// mkdir
int mkdir_(const me_t* me, int sock_fd, char* cmd);

// cd
int cd(me_t* me, int sock_fd, char* cmd);

// rm
int rm(me_t* me, int sock_fd, char* cmd);

// 长命令封装小火车
int make_protocal(messenger_t *msg, const cmd_t cmd, const me_t *me, const char *cmds);


// 子线程的入口函数
void* start_routine(void* args);



